
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" lang="zh_Hans">
  <head>
    <meta http-equiv="X-UA-Compatible" content="IE=Edge" />
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>设计理念 &#8212; Django 3.2.11.dev 文档</title>
    <link rel="stylesheet" href="../_static/default.css" type="text/css" />
    <link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
    <script type="text/javascript" id="documentation_options" data-url_root="../" src="../_static/documentation_options.js"></script>
    <script type="text/javascript" src="../_static/jquery.js"></script>
    <script type="text/javascript" src="../_static/underscore.js"></script>
    <script type="text/javascript" src="../_static/doctools.js"></script>
    <script type="text/javascript" src="../_static/language_data.js"></script>
    <link rel="index" title="索引" href="../genindex.html" />
    <link rel="search" title="搜索" href="../search.html" />
    <link rel="next" title="Django 的第三方发布包" href="distributions.html" />
    <link rel="prev" title="API 的稳定性" href="api-stability.html" />



 
<script src="../templatebuiltins.js"></script>
<script>
(function($) {
    if (!django_template_builtins) {
       // templatebuiltins.js missing, do nothing.
       return;
    }
    $(document).ready(function() {
        // Hyperlink Django template tags and filters
        var base = "../ref/templates/builtins.html";
        if (base == "#") {
            // Special case for builtins.html itself
            base = "";
        }
        // Tags are keywords, class '.k'
        $("div.highlight\\-html\\+django span.k").each(function(i, elem) {
             var tagname = $(elem).text();
             if ($.inArray(tagname, django_template_builtins.ttags) != -1) {
                 var fragment = tagname.replace(/_/, '-');
                 $(elem).html("<a href='" + base + "#" + fragment + "'>" + tagname + "</a>");
             }
        });
        // Filters are functions, class '.nf'
        $("div.highlight\\-html\\+django span.nf").each(function(i, elem) {
             var filtername = $(elem).text();
             if ($.inArray(filtername, django_template_builtins.tfilters) != -1) {
                 var fragment = filtername.replace(/_/, '-');
                 $(elem).html("<a href='" + base + "#" + fragment + "'>" + filtername + "</a>");
             }
        });
    });
})(jQuery);</script>

  </head><body>

    <div class="document">
  <div id="custom-doc" class="yui-t6">
    <div id="hd">
      <h1><a href="../index.html">Django 3.2.11.dev 文档</a></h1>
      <div id="global-nav">
        <a title="Home page" href="../index.html">Home</a>  |
        <a title="Table of contents" href="../contents.html">Table of contents</a>  |
        <a title="Global index" href="../genindex.html">Index</a>  |
        <a title="Module index" href="../py-modindex.html">Modules</a>
      </div>
      <div class="nav">
    &laquo; <a href="api-stability.html" title="API 的稳定性">previous</a>
     |
    <a href="index.html" title="元文件和杂记" accesskey="U">up</a>
   |
    <a href="distributions.html" title="Django 的第三方发布包">next</a> &raquo;</div>
    </div>

    <div id="bd">
      <div id="yui-main">
        <div class="yui-b">
          <div class="yui-g" id="misc-design-philosophies">
            
  <div class="section" id="s-design-philosophies">
<span id="design-philosophies"></span><h1>设计理念<a class="headerlink" href="#design-philosophies" title="永久链接至标题">¶</a></h1>
<p>本文档解释了 Django 开发人员在开发 Django 时使用的一些基本哲学， 它的目标是解释过去并指导未来</p>
<div class="section" id="s-overall">
<span id="overall"></span><h2>总体<a class="headerlink" href="#overall" title="永久链接至标题">¶</a></h2>
<div class="section" id="s-loose-coupling">
<span id="s-id1"></span><span id="loose-coupling"></span><span id="id1"></span><h3>松耦合<a class="headerlink" href="#loose-coupling" title="永久链接至标题">¶</a></h3>
<p id="index-0">Django 栈的基本目标是 <a class="reference external" href="http://wiki.c2.com/?CouplingAndCohesion">低耦合高内聚</a>。框架里的不同层（Layers）不应该知道对方的代码，除非它们确实需要。</p>
<p>例如，模板系统不需要知道用户的 Web 请求，数据库层不需要了解如果显示数据，而视图并不关心程序员所使用的模板系统。</p>
<p>尽管为了方便 Django 带有一个完整的堆栈，但堆栈的各个部分尽可能独立于另一个堆栈。</p>
</div>
<div class="section" id="s-less-code">
<span id="s-id2"></span><span id="less-code"></span><span id="id2"></span><h3>更少的代码<a class="headerlink" href="#less-code" title="永久链接至标题">¶</a></h3>
<p>Django 应用的代码应该尽可能地精简，Django 应该充分利用 Python 的动态能力，比如自省机制（introspection）。</p>
</div>
<div class="section" id="s-quick-development">
<span id="s-id3"></span><span id="quick-development"></span><span id="id3"></span><h3>快速开发<a class="headerlink" href="#quick-development" title="永久链接至标题">¶</a></h3>
<p>在 21 世纪，Web 框架的核心一点是让 Web 开发中枯燥的事情处理得更加快速，Django 可以做到快速的 Web 开发。</p>
</div>
<div class="section" id="s-don-t-repeat-yourself-dry">
<span id="s-dry"></span><span id="don-t-repeat-yourself-dry"></span><span id="dry"></span><h3>不要重复地造轮子 (DRY)<a class="headerlink" href="#don-t-repeat-yourself-dry" title="永久链接至标题">¶</a></h3>
<p id="index-1">每个独特的概念或数据片应该存在且只存在于一个地方。避免冗余，做好标准化。</p>
<p>合理的框架应该从尽可能少的信息中推断出尽可能多的需求。</p>
<div class="admonition seealso">
<p class="first admonition-title">参见</p>
<p class="last"><a class="reference external" href="http://wiki.c2.com/?DontRepeatYourself">波特兰模式知识库中关于DRY的讨论</a></p>
</div>
</div>
<div class="section" id="s-explicit-is-better-than-implicit">
<span id="s-id5"></span><span id="explicit-is-better-than-implicit"></span><span id="id5"></span><h3>明确优于隐式<a class="headerlink" href="#explicit-is-better-than-implicit" title="永久链接至标题">¶</a></h3>
<p>这是在 <span class="target" id="index-6"></span><a class="pep reference external" href="https://www.python.org/dev/peps/pep-0020"><strong>PEP 20</strong></a> 列出的核心 Python 原则，这意味着 Django 不应该使用太多的“魔术”。除非有一个很好的理由，否则不应该出现魔术。只有当魔术创造了巨大的便利，并且使用其他方式难以实现时，它才值得使用，而且它的实现方式并不会让试图学习如何使用该功能的开发人员感到困惑。</p>
</div>
<div class="section" id="s-consistency">
<span id="s-id6"></span><span id="consistency"></span><span id="id6"></span><h3>一致性<a class="headerlink" href="#consistency" title="永久链接至标题">¶</a></h3>
<p>框架应在所有层级上保持一致。一致性适用于从低级（Python 的编码风格）到高级（使用 Django 的“经验”）的所有内容。</p>
</div>
</div>
<div class="section" id="s-models">
<span id="models"></span><h2>模型<a class="headerlink" href="#models" title="永久链接至标题">¶</a></h2>
<div class="section" id="s-id7">
<span id="id7"></span><h3>明确优于隐式<a class="headerlink" href="#id7" title="永久链接至标题">¶</a></h3>
<p>字段不应该仅仅根据字段的名称来假定某些行为。这需要对系统有太多了解，并且容易出现错误。相反，其行为应该基于关键字参数，并且在某些情况下，应该基于字段的类型。</p>
</div>
<div class="section" id="s-include-all-relevant-domain-logic">
<span id="include-all-relevant-domain-logic"></span><h3>包括所有相关领域逻辑<a class="headerlink" href="#include-all-relevant-domain-logic" title="永久链接至标题">¶</a></h3>
<p>模型应该封装一个“对象”的各个方面，遵循 Martin Fowler 的 <a class="reference external" href="https://www.martinfowler.com/eaaCatalog/activeRecord.html">Active Record</a> 设计模式。</p>
<p>这就是为什么在模型类中要同时定义一个模型表现的数据以及关于它的信息（包括其人类可读的名称，默认排序等选项）；所有用于理解给定模型所需的信息都应该存储在模型中。</p>
</div>
</div>
<div class="section" id="s-database-api">
<span id="database-api"></span><h2>数据库API<a class="headerlink" href="#database-api" title="永久链接至标题">¶</a></h2>
<p>数据库API的主要用处：</p>
<div class="section" id="s-sql-efficiency">
<span id="sql-efficiency"></span><h3>SQL效率<a class="headerlink" href="#sql-efficiency" title="永久链接至标题">¶</a></h3>
<p>应该尽可能少地执行SQL语句，并且应该在内部优化语句。</p>
<p>这就是为什么开发者需要显式地调用 <code class="docutils literal notranslate"><span class="pre">save()</span></code>，而不是由框架静默地在幕后保存东西。</p>
<p>这也是为什么 <code class="docutils literal notranslate"><span class="pre">select_related()</span></code> <code class="docutils literal notranslate"><span class="pre">QuerySet</span></code> 方法存在的原因。在查询“每个关联的对象”的常见情况下，它是一个可选的性能提升器。</p>
</div>
<div class="section" id="s-terse-powerful-syntax">
<span id="terse-powerful-syntax"></span><h3>简洁, 强大的语法<a class="headerlink" href="#terse-powerful-syntax" title="永久链接至标题">¶</a></h3>
<p>数据库 API 应该允许用尽可能少的语法，来表达丰富、达意的语句。它不应该依赖于导入其他模块或辅助对象。</p>
<p>当必要时, 在幕后插入应该是自动进行的.</p>
<p>每一个对象都应该能够访问所有相关的对象, 系统范围. 这种访问应该是双向的.</p>
</div>
<div class="section" id="s-option-to-drop-into-raw-sql-easily-when-needed">
<span id="option-to-drop-into-raw-sql-easily-when-needed"></span><h3>当有必要时, 可方便地选择使用原始 SQL 语句<a class="headerlink" href="#option-to-drop-into-raw-sql-easily-when-needed" title="永久链接至标题">¶</a></h3>
<p>应该认识到数据库 API 只是一个便捷的方法，但并不必须是最终的全部手段。框架应该可以很容易地编写自定义的 SQL——完整的语句，或者仅仅是自定义 <code class="docutils literal notranslate"><span class="pre">WHERE</span></code> 子句作为 API 调用时的自定义参数。</p>
</div>
</div>
<div class="section" id="s-url-design">
<span id="url-design"></span><h2>URL 设计<a class="headerlink" href="#url-design" title="永久链接至标题">¶</a></h2>
<div class="section" id="s-id8">
<span id="id8"></span><h3>松耦合<a class="headerlink" href="#id8" title="永久链接至标题">¶</a></h3>
<p>Django 应用中的 URL 不应该与底层 Python 代码耦合。将 URL 与 Python 函数名联系起来是一件很糟糕且丑陋的做法。</p>
<p>按照这些方法，Django URL 系统应该允许同一应用的 URL 在不同的上下文中有所不同。例如，一个网站可以在 <code class="docutils literal notranslate"><span class="pre">/stories/</span></code> 中放置故事，而另一个网站则可以使用 <code class="docutils literal notranslate"><span class="pre">/news/</span></code>。</p>
</div>
<div class="section" id="s-infinite-flexibility">
<span id="infinite-flexibility"></span><h3>无限的灵活性<a class="headerlink" href="#infinite-flexibility" title="永久链接至标题">¶</a></h3>
<p>URL 应该尽可能灵活。任何可想到的 URL 设计都应该被允许。</p>
</div>
<div class="section" id="s-encourage-best-practices">
<span id="encourage-best-practices"></span><h3>鼓励最佳实践<a class="headerlink" href="#encourage-best-practices" title="永久链接至标题">¶</a></h3>
<p>框架可以做到让开发者简单（或更加简单）地设计出漂亮的，而不是难看的 URL。</p>
<p>在 URL 中应避免出现文件后缀名。</p>
<p>在 URL 中使用 Vignette 式的逗号应该受到严厉的惩罚。</p>
</div>
<div class="section" id="s-definitive-urls">
<span id="s-id9"></span><span id="definitive-urls"></span><span id="id9"></span><h3>定义URL<a class="headerlink" href="#definitive-urls" title="永久链接至标题">¶</a></h3>
<p id="index-3">技术上，<code class="docutils literal notranslate"><span class="pre">foo.com/bar</span></code> 和 <code class="docutils literal notranslate"><span class="pre">foo.com/bar/</span></code> 是两条不同的 URL，搜索引擎爬虫（以及某些 Web 流量分析工具）会将其视为独立的页面。Django 会将其转为 &quot;标准&quot; 的 URL，让搜索引擎爬虫正确识别。</p>
<p>详细请参考 <a class="reference internal" href="../ref/settings.html#std:setting-APPEND_SLASH"><code class="xref std std-setting docutils literal notranslate"><span class="pre">APPEND_SLASH</span></code></a> 配置。</p>
</div>
</div>
<div class="section" id="s-template-system">
<span id="template-system"></span><h2>模板系统<a class="headerlink" href="#template-system" title="永久链接至标题">¶</a></h2>
<div class="section" id="s-separate-logic-from-presentation">
<span id="s-separation-of-logic-and-presentation"></span><span id="separate-logic-from-presentation"></span><span id="separation-of-logic-and-presentation"></span><h3>逻辑分离的解决方案<a class="headerlink" href="#separate-logic-from-presentation" title="永久链接至标题">¶</a></h3>
<p>我们将模板系统看作一个工具，用于控制表现方式和表示方式相关的逻辑。模板系统不应该支持超出这个基本目标的功能。</p>
</div>
<div class="section" id="s-discourage-redundancy">
<span id="discourage-redundancy"></span><h3>避免冗余<a class="headerlink" href="#discourage-redundancy" title="永久链接至标题">¶</a></h3>
<p>大多数动态网站会使用一些网站整体通用的设计——一个通用的页眉、页脚、导航栏，等等。Django 模板系统应该可以很容易地将这些元素存储在一个地方，从而减少重复的代码。</p>
<p>这是 <a class="reference internal" href="../ref/templates/language.html#template-inheritance"><span class="std std-ref">模板继承</span></a> 背后的理念。</p>
</div>
<div class="section" id="s-be-decoupled-from-html">
<span id="be-decoupled-from-html"></span><h3>从 HTML 中解耦<a class="headerlink" href="#be-decoupled-from-html" title="永久链接至标题">¶</a></h3>
<p>模板系统不应该被设计成只能输出 HTML。它应该同样擅长生成其他基于文本的格式，或者仅仅是纯文本。</p>
</div>
<div class="section" id="s-xml-should-not-be-used-for-template-languages">
<span id="xml-should-not-be-used-for-template-languages"></span><h3>XML不应被用于模板语言<a class="headerlink" href="#xml-should-not-be-used-for-template-languages" title="永久链接至标题">¶</a></h3>
<p id="index-4">使用 XML 引擎去解析模板会在编辑模板的过程中引入很多人为错误，并在模板处理中导致不可接受的开销。</p>
</div>
<div class="section" id="s-assume-designer-competence">
<span id="assume-designer-competence"></span><h3>承担设计能力<a class="headerlink" href="#assume-designer-competence" title="永久链接至标题">¶</a></h3>
<p>模板系统不应该有的设计是，使得模板可以在WYSIWYG（所见即所得）编辑器中也能显示得很好，比如 Dreamweaver。因为这是一个非常严重的限制，会让模板的语法不够好。Django 期望模板编写者有能力直接编辑 HTML 文本。</p>
</div>
<div class="section" id="s-treat-whitespace-obviously">
<span id="treat-whitespace-obviously"></span><h3>更加直接的处理空格<a class="headerlink" href="#treat-whitespace-obviously" title="永久链接至标题">¶</a></h3>
<p>模板系统不应该用空白符来做神奇的事情。如果模板包含空白符，系统应该在处理文本时处理空格——只是显示它。任何不在模板标签中的空白符都应该显示出来。</p>
</div>
<div class="section" id="s-don-t-invent-a-programming-language">
<span id="don-t-invent-a-programming-language"></span><h3>不要发明一种编程语言<a class="headerlink" href="#don-t-invent-a-programming-language" title="永久链接至标题">¶</a></h3>
<p>模板系统的目标不是发明一种编程语言。它的目标是提供足够的具有编程风格的功能，比如分支和循环，这对于做出表现相关的决策是至关重要的。<a class="reference internal" href="../topics/templates.html#template-language-intro"><span class="std std-ref">Django 模板语言（DTL）</span></a> 旨在避免高级逻辑。</p>
<p>Django 模板系统认为模板通常是由 <em>设计师</em> 编写的，而不是 <em>程序员</em>，因此不应该假设他了解 Python。</p>
</div>
<div class="section" id="s-safety-and-security">
<span id="safety-and-security"></span><h3>安全与保障<a class="headerlink" href="#safety-and-security" title="永久链接至标题">¶</a></h3>
<p>开箱即用的模板系统禁止包含恶意代码，例如删除数据库记录的代码。</p>
<p>这就是模板系统不允许有任意Python代码的另一个原因。</p>
</div>
<div class="section" id="s-extensibility">
<span id="extensibility"></span><h3>可扩展性<a class="headerlink" href="#extensibility" title="永久链接至标题">¶</a></h3>
<p>模板系统应该认识到, 高阶的模板作者可能想扩展它.</p>
<p>这是自定义的模板标签和过滤器背后的理念.</p>
</div>
</div>
<div class="section" id="s-views">
<span id="views"></span><h2>视图<a class="headerlink" href="#views" title="永久链接至标题">¶</a></h2>
<div class="section" id="s-simplicity">
<span id="simplicity"></span><h3>简洁<a class="headerlink" href="#simplicity" title="永久链接至标题">¶</a></h3>
<p>编写视图应该和编写 Python 函数一样简单。开发人员不应该在函数执行时实例化一个类。</p>
</div>
<div class="section" id="s-use-request-objects">
<span id="use-request-objects"></span><h3>使用请求对象<a class="headerlink" href="#use-request-objects" title="永久链接至标题">¶</a></h3>
<p>视图应该能够访问一个请求对象——一个储存关于当前请求的元数据的对象。对象应该直接传递给视图函数，而不是必须从全局变量访问请求数据的视图函数。这使得通过传入“假”请求对象来测试视图变得轻松、干净和容易。</p>
</div>
<div class="section" id="s-id10">
<span id="id10"></span><h3>松耦合<a class="headerlink" href="#id10" title="永久链接至标题">¶</a></h3>
<p>视图不应该关心开发人员使用哪种模板——甚至根本不用模板系统。</p>
</div>
<div class="section" id="s-differentiate-between-get-and-post">
<span id="differentiate-between-get-and-post"></span><h3>GET 方法和 POST 方法的区别<a class="headerlink" href="#differentiate-between-get-and-post" title="永久链接至标题">¶</a></h3>
<p>GET 和 POST 是不同的；开发人员应该明确地使用其中一个或另一个。框架应该使得 GET 和 POST 数据很容易区分。</p>
</div>
</div>
<div class="section" id="s-cache-framework">
<span id="s-cache-design-philosophy"></span><span id="cache-framework"></span><span id="cache-design-philosophy"></span><h2>缓存框架<a class="headerlink" href="#cache-framework" title="永久链接至标题">¶</a></h2>
<p><a class="reference internal" href="../topics/cache.html"><span class="doc">缓存框架</span></a> 的核心目的是：</p>
<div class="section" id="s-id11">
<span id="id11"></span><h3>更少的代码<a class="headerlink" href="#id11" title="永久链接至标题">¶</a></h3>
<p>缓存应该尽可能快。因此，围绕缓存后端的所有框架代码都应该保持在绝对的最小值，特别是对于 <code class="docutils literal notranslate"><span class="pre">get()</span></code> 操作。</p>
</div>
<div class="section" id="s-id12">
<span id="id12"></span><h3>一致性<a class="headerlink" href="#id12" title="永久链接至标题">¶</a></h3>
<p>缓存 API 应该为不同的缓存后端提供一致的接口。</p>
</div>
<div class="section" id="s-id13">
<span id="id13"></span><h3>可扩展性<a class="headerlink" href="#id13" title="永久链接至标题">¶</a></h3>
<p>缓存 API 应该基于开发者的需求，在应用程序级别上是可扩展的（例如，参见 <a class="reference internal" href="../topics/cache.html#cache-key-transformation"><span class="std std-ref">缓存键转换</span></a>）。</p>
</div>
</div>
</div>


          </div>
        </div>
      </div>
      
        
          <div class="yui-b" id="sidebar">
            
      <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
        <div class="sphinxsidebarwrapper">
  <h3><a href="../contents.html">Table of Contents</a></h3>
  <ul>
<li><a class="reference internal" href="#">设计理念</a><ul>
<li><a class="reference internal" href="#overall">总体</a><ul>
<li><a class="reference internal" href="#loose-coupling">松耦合</a></li>
<li><a class="reference internal" href="#less-code">更少的代码</a></li>
<li><a class="reference internal" href="#quick-development">快速开发</a></li>
<li><a class="reference internal" href="#don-t-repeat-yourself-dry">不要重复地造轮子 (DRY)</a></li>
<li><a class="reference internal" href="#explicit-is-better-than-implicit">明确优于隐式</a></li>
<li><a class="reference internal" href="#consistency">一致性</a></li>
</ul>
</li>
<li><a class="reference internal" href="#models">模型</a><ul>
<li><a class="reference internal" href="#id7">明确优于隐式</a></li>
<li><a class="reference internal" href="#include-all-relevant-domain-logic">包括所有相关领域逻辑</a></li>
</ul>
</li>
<li><a class="reference internal" href="#database-api">数据库API</a><ul>
<li><a class="reference internal" href="#sql-efficiency">SQL效率</a></li>
<li><a class="reference internal" href="#terse-powerful-syntax">简洁, 强大的语法</a></li>
<li><a class="reference internal" href="#option-to-drop-into-raw-sql-easily-when-needed">当有必要时, 可方便地选择使用原始 SQL 语句</a></li>
</ul>
</li>
<li><a class="reference internal" href="#url-design">URL 设计</a><ul>
<li><a class="reference internal" href="#id8">松耦合</a></li>
<li><a class="reference internal" href="#infinite-flexibility">无限的灵活性</a></li>
<li><a class="reference internal" href="#encourage-best-practices">鼓励最佳实践</a></li>
<li><a class="reference internal" href="#definitive-urls">定义URL</a></li>
</ul>
</li>
<li><a class="reference internal" href="#template-system">模板系统</a><ul>
<li><a class="reference internal" href="#separate-logic-from-presentation">逻辑分离的解决方案</a></li>
<li><a class="reference internal" href="#discourage-redundancy">避免冗余</a></li>
<li><a class="reference internal" href="#be-decoupled-from-html">从 HTML 中解耦</a></li>
<li><a class="reference internal" href="#xml-should-not-be-used-for-template-languages">XML不应被用于模板语言</a></li>
<li><a class="reference internal" href="#assume-designer-competence">承担设计能力</a></li>
<li><a class="reference internal" href="#treat-whitespace-obviously">更加直接的处理空格</a></li>
<li><a class="reference internal" href="#don-t-invent-a-programming-language">不要发明一种编程语言</a></li>
<li><a class="reference internal" href="#safety-and-security">安全与保障</a></li>
<li><a class="reference internal" href="#extensibility">可扩展性</a></li>
</ul>
</li>
<li><a class="reference internal" href="#views">视图</a><ul>
<li><a class="reference internal" href="#simplicity">简洁</a></li>
<li><a class="reference internal" href="#use-request-objects">使用请求对象</a></li>
<li><a class="reference internal" href="#id10">松耦合</a></li>
<li><a class="reference internal" href="#differentiate-between-get-and-post">GET 方法和 POST 方法的区别</a></li>
</ul>
</li>
<li><a class="reference internal" href="#cache-framework">缓存框架</a><ul>
<li><a class="reference internal" href="#id11">更少的代码</a></li>
<li><a class="reference internal" href="#id12">一致性</a></li>
<li><a class="reference internal" href="#id13">可扩展性</a></li>
</ul>
</li>
</ul>
</li>
</ul>

  <h4>上一个主题</h4>
  <p class="topless"><a href="api-stability.html"
                        title="上一章">API 的稳定性</a></p>
  <h4>下一个主题</h4>
  <p class="topless"><a href="distributions.html"
                        title="下一章">Django 的第三方发布包</a></p>
  <div role="note" aria-label="source link">
    <h3>本页</h3>
    <ul class="this-page-menu">
      <li><a href="../_sources/misc/design-philosophies.txt"
            rel="nofollow">显示源代码</a></li>
    </ul>
   </div>
<div id="searchbox" style="display: none" role="search">
  <h3>快速搜索</h3>
    <div class="searchformwrapper">
    <form class="search" action="../search.html" method="get">
      <input type="text" name="q" />
      <input type="submit" value="转向" />
      <input type="hidden" name="check_keywords" value="yes" />
      <input type="hidden" name="area" value="default" />
    </form>
    </div>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
        </div>
      </div>
              <h3>Last update:</h3>
              <p class="topless">12月 07, 2021</p>
          </div>
        
      
    </div>

    <div id="ft">
      <div class="nav">
    &laquo; <a href="api-stability.html" title="API 的稳定性">previous</a>
     |
    <a href="index.html" title="元文件和杂记" accesskey="U">up</a>
   |
    <a href="distributions.html" title="Django 的第三方发布包">next</a> &raquo;</div>
    </div>
  </div>

      <div class="clearer"></div>
    </div>
  </body>
</html>